package com.yunwushanhe.preheating;

import com.yunwushanhe.constant.RedisConstant;
import com.yunwushanhe.entity.Article;
import com.yunwushanhe.mapper.ArticleMapper;
import com.yunwushanhe.util.RedisCache;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @Author 抬头看看天
 * @Date 2023-08-15  15:28:57
 * 用于实现项目启动时预处理的类
 */

// 这里应该有一个知识点，就是关于使用 Resource 注入对象的时候，
// 如果所在类未被注入，视乎会出问题，在 SpringSecurity教程中有所提到
@Component
public class ViewCountRunner implements CommandLineRunner {

    @Resource
    private ArticleMapper articleMapper;

    @Resource
    private RedisCache redisCache;

    @Override
    public void run(String... args) throws Exception {
        List<Article> articleList = articleMapper.selectList(null);
        Map<String,Integer> viewCountMap = articleList.stream()
                .collect(Collectors.toMap(article -> article.getId().toString(),
                        article -> article.getViewCount().intValue()));
        // 数据库中viewCount是Long类型，之所以变为Integer是应为存入redis中进行自增操作1L类型数据不行，而Long类型数据到redis中就会变成1L类型
        redisCache.setCacheMap(RedisConstant.ARTICLE_VIEWCOUNT_KEY,viewCountMap);
    }
}
